// 数据库功能测试脚本
// 使用动态导入以避免初始化顺序问题
let dbServiceInstance = null

// 测试集合名称
const TEST_COLLECTION = 'testCollection'

// 确保dbService已加载
async function ensureDbService() {
  if (!dbServiceInstance) {
    try {
      // 尝试从不同路径导入
      try {
        const module = await import('./dbService.js')
        dbServiceInstance = module.default
      } catch (e) {
        // 备用路径
        const module = await import('../services/dbService.js')
        dbServiceInstance = module.dbService || module.default
      }
    } catch (error) {
      console.error('加载dbService失败:', error)
      throw new Error('数据库服务加载失败')
    }
  }
  return dbServiceInstance
}

// 测试函数
export async function runDatabaseTests() {
  console.log('=== 开始数据库功能测试 ===')
  
  let dbService
  try {
    dbService = await ensureDbService()
    if (!dbService) {
      console.error('dbService未正确加载')
      return { success: false, error: '数据库服务未初始化' }
    }
  } catch (error) {
    console.error('初始化数据库服务失败:', error)
    return { success: false, error: error.message }
  }
  
  const passed = []
  const failed = []
  let addedDoc = null
  
  try {
    // 1. 测试清空集合
    console.log('1. 测试清空集合...')
    try {
      await dbService.clearCollection(TEST_COLLECTION)
      const initialSize = await dbService.getCollectionSize(TEST_COLLECTION)
      console.log(`   ✓ 初始集合大小: ${initialSize}`)
      passed.push({ name: '清空集合' })
    } catch (error) {
      console.error(`   ✗ 清空集合失败: ${error.message}`)
      failed.push({ name: '清空集合', error: error.message })
    }
    
    // 2. 测试添加文档
    console.log('2. 测试添加文档...')
    try {
      const testDoc = {
        name: '测试文档',
        description: '这是一个测试文档',
        number: 123,
        tags: ['test', 'database'],
      }
      addedDoc = await dbService.addDocument(TEST_COLLECTION, testDoc)
      console.log(`   ✓ 添加文档成功: ID = ${addedDoc.id}`)
      passed.push({ name: '添加文档' })
    } catch (error) {
      console.error(`   ✗ 添加文档失败: ${error.message}`)
      failed.push({ name: '添加文档', error: error.message })
    }
    
    // 3. 测试获取文档
    console.log('3. 测试获取文档...')
    try {
      if (addedDoc) {
        const retrievedDoc = await dbService.getDocument(TEST_COLLECTION, addedDoc.id)
        console.log(`   ✓ 获取文档成功: name = ${retrievedDoc.name}`)
        passed.push({ name: '获取文档' })
      } else {
        console.log('   ✗ 跳过获取文档测试: 未成功添加文档')
      }
    } catch (error) {
      console.error(`   ✗ 获取文档失败: ${error.message}`)
      failed.push({ name: '获取文档', error: error.message })
    }
    
    // 4. 测试获取集合
    console.log('4. 测试获取集合...')
    try {
      const collection = await dbService.getCollection(TEST_COLLECTION)
      console.log(`   ✓ 获取集合成功: 共${collection.length}个文档`)
      passed.push({ name: '获取集合' })
    } catch (error) {
      console.error(`   ✗ 获取集合失败: ${error.message}`)
      failed.push({ name: '获取集合', error: error.message })
    }
    
    // 5. 测试更新文档
    console.log('5. 测试更新文档...')
    try {
      if (addedDoc) {
        const updatedDoc = await dbService.updateDocument(TEST_COLLECTION, addedDoc.id, {
          name: '更新后的测试文档',
          number: 456,
        })
        console.log(`   ✓ 更新文档成功: name = ${updatedDoc.name}, number = ${updatedDoc.number}`)
        passed.push({ name: '更新文档' })
      } else {
        console.log('   ✗ 跳过更新文档测试: 未成功添加文档')
      }
    } catch (error) {
      console.error(`   ✗ 更新文档失败: ${error.message}`)
      failed.push({ name: '更新文档', error: error.message })
    }
    
    // 6. 测试条件查询
    console.log('6. 测试条件查询...')
    try {
      const queryResult = await dbService.queryDocuments(TEST_COLLECTION, 'number', '>=', 400)
      const docs = Array.isArray(queryResult) ? queryResult : queryResult.documents || []
      console.log(`   ✓ 查询成功: 找到${docs.length}个文档`)
      passed.push({ name: '条件查询' })
    } catch (error) {
      console.error(`   ✗ 条件查询失败: ${error.message}`)
      failed.push({ name: '条件查询', error: error.message })
    }
    
    // 7. 测试批量添加
    console.log('7. 测试批量添加...')
    try {
      const batchDocs = [
        { name: '批量文档1', value: 10 },
        { name: '批量文档2', value: 20 },
        { name: '批量文档3', value: 30 },
      ]
      const addedBatchDocs = await dbService.batchAddDocuments(TEST_COLLECTION, batchDocs)
      console.log(`   ✓ 批量添加成功: 添加了${addedBatchDocs.length}个文档`)
      passed.push({ name: '批量添加' })
    } catch (error) {
      console.error(`   ✗ 批量添加失败: ${error.message}`)
      failed.push({ name: '批量添加', error: error.message })
    }
    
    // 8. 测试数组包含查询
    console.log('8. 测试数组包含查询...')
    try {
      const arrayQueryResult = await dbService.queryDocuments(TEST_COLLECTION, 'tags', 'array-contains', 'test')
      const docs = Array.isArray(arrayQueryResult) ? arrayQueryResult : arrayQueryResult.documents || []
      console.log(`   ✓ 数组查询成功: 找到${docs.length}个文档`)
      passed.push({ name: '数组包含查询' })
    } catch (error) {
      console.error(`   ✗ 数组包含查询失败: ${error.message}`)
      failed.push({ name: '数组包含查询', error: error.message })
    }
    
    // 9. 测试事务
    console.log('9. 测试事务...')
    try {
      const transactionResult = await dbService.runTransaction(async (transaction) => {
        await dbService.addTransactionOperation(transaction, 'add', TEST_COLLECTION, {
          name: '事务添加的文档',
          transaction: true,
        })
        if (addedDoc) {
          await dbService.addTransactionOperation(transaction, 'update', TEST_COLLECTION, addedDoc.id, {
            fromTransaction: true,
          })
        }
      })
      console.log(`   ✓ 事务执行成功: ${transactionResult ? transactionResult.length : '未知'}个操作完成`)
      passed.push({ name: '事务' })
    } catch (error) {
      console.error(`   ✗ 事务失败: ${error.message}`)
      failed.push({ name: '事务', error: error.message })
    }
    
    // 10. 测试错误处理 - 不存在的文档
    console.log('10. 测试错误处理 - 不存在的文档...')
    try {
      try {
        await dbService.updateDocument(TEST_COLLECTION, 'nonExistentId', { name: '测试' })
        console.log('   ✗ 应该抛出错误但没有')
        failed.push({ name: '错误处理-不存在文档', error: '未抛出预期错误' })
      } catch (error) {
        console.log(`   ✓ 正确捕获错误: ${error.code || 'Unknown'}`)
        passed.push({ name: '错误处理-不存在文档' })
      }
    } catch (error) {
      console.error(`   ✗ 错误处理测试失败: ${error.message}`)
      failed.push({ name: '错误处理-不存在文档', error: error.message })
    }
    
    // 11. 测试错误处理 - 验证
    console.log('11. 测试错误处理 - 数据验证...')
    try {
      try {
        await dbService.addDocument(TEST_COLLECTION, 'notAnObject')
        console.log('   ✗ 应该抛出错误但没有')
        failed.push({ name: '错误处理-数据验证', error: '未抛出预期错误' })
      } catch (error) {
        console.log(`   ✓ 正确捕获验证错误: ${error.code || 'Unknown'}`)
        passed.push({ name: '错误处理-数据验证' })
      }
    } catch (error) {
      console.error(`   ✗ 数据验证测试失败: ${error.message}`)
      failed.push({ name: '错误处理-数据验证', error: error.message })
    }
    
    // 12. 检查最终集合大小
    console.log('12. 检查最终集合大小...')
    try {
      const finalSize = await dbService.getCollectionSize(TEST_COLLECTION)
      console.log(`   ✓ 最终集合大小: ${finalSize}`)
      passed.push({ name: '检查集合大小' })
    } catch (error) {
      console.error(`   ✗ 检查集合大小失败: ${error.message}`)
      failed.push({ name: '检查集合大小', error: error.message })
    }
    
    // 13. 测试删除文档
    console.log('13. 测试删除文档...')
    try {
      if (addedDoc) {
        await dbService.deleteDocument(TEST_COLLECTION, addedDoc.id)
        const afterDeleteSize = await dbService.getCollectionSize(TEST_COLLECTION)
        console.log(`   ✓ 删除文档成功: 删除后大小 = ${afterDeleteSize}`)
        passed.push({ name: '删除文档' })
      } else {
        console.log('   ✗ 跳过删除文档测试: 未成功添加文档')
      }
    } catch (error) {
      console.error(`   ✗ 删除文档失败: ${error.message}`)
      failed.push({ name: '删除文档', error: error.message })
    }
    
    console.log('\n=== 所有测试完成! ===')
    console.log(`通过测试: ${passed.length}`)
    console.log(`失败测试: ${failed.length}`)
    
    return { passed, failed }
    
  } catch (error) {
    console.error('\n=== 测试执行失败! ===')
    console.error('错误详情:', error)
    failed.push({ name: '整体测试执行', error: error.message })
    return { passed, failed }
  }
}

// 仅在直接运行脚本时执行测试
if (import.meta.url === new URL(import.meta.url).href) {
  runDatabaseTests().then(results => {
    console.log('\n测试完成！')
    console.log(`通过测试: ${results.passed ? results.passed.length : 0}`)
    console.log(`失败测试: ${results.failed ? results.failed.length : 0}`)
    if (results.failed && results.failed.length > 0) {
      console.log('\n失败详情:')
      results.failed.forEach(test => {
        console.log(`- ${test.name}: ${test.error}`)
      })
    }
  }).catch(error => {
    console.error('测试运行失败:', error)
    return { success: false, error: error.message }
  })
}

// 导出测试函数供外部调用
export { runDatabaseTests as testDatabase }